from flask import render_template, current_app, session, request, jsonify, g
from info import constants
from info.models import User, News, Category
from info.response_code import RET
from info.utils.common import user_login_data
from . import index_blue
import logging


@index_blue.route('/', methods=['GET', 'POST'])
@user_login_data
def index():
    """
    主页
    1.查询用户信息
    2.查询新闻点击排行榜
    3.查询新闻分类列表
    4.构造响应数据
    5.返回响应及数据
    """
    # 查询登录用户
    user = g.user

    # 查询点击新闻排行
    """
    通过新闻的点击量来查询新闻，用倒序的方式，并且限制显示的新闻条数。
    然后循环遍历这个查询到的列表对象，并把遍历出来的新闻用to_basic_dict()方法进行格式化，然后添加进新闻的字典列表中，构造响应数据。
    添加全局变量是因为，如果查询不到数据时，对象为空，多以要添加全局变量。
    """
    news_list = None
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        logging.error(e)

    click_news_list = []
    for news in news_list if news_list else []:
        click_news_list.append(news.to_basic_dict())

    # 查询新闻分类列表
    """
    直接查询出所有的新闻分类，直接构造响应数据。
    添加全局变量是因为，如果查询不到数据时，对象为空，多以要添加全局变量。
    """
    categories = None
    try:
        categories = Category.query.all()
    except Exception as e:
        logging.error(e)
    # 构造响应数据
    context = {
        'user': user.to_dict() if user else None,
        'click_news_list': click_news_list,
        'categories': categories
    }
    return render_template('news/index.html', context=context)


@index_blue.route('/news_list')
def news_list():
    """
    新闻列表数据
    1.接收参数（分类id，页数[可以不传，默认为1]，每页多少数据[可以不传，默认为10]）
    2.判断参数是否齐全,参数是否都为整数
    3.通过分类id去查询该分类下新闻列表内容数据
    4.构造响应数据
    5.返回响应数据
    """
    cid = request.args.get('cid', 1)
    page = request.args.get('page', 1)
    per_page = request.args.get('per_page', 10)

    if not all([cid, page, per_page]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不足')
    try:
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数格式错误')
    try:
        if cid == 1:
            paginate = News.query.filter(News.status == 0).order_by(News.create_time.desc()).paginate(page, per_page, False)
        else:
            paginate = News.query.filter(News.category_id == cid, News.status == 0).order_by(News.create_time.desc()).paginate(page, per_page, False)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据失败')
    # 构造响应数据
    news_list = paginate.items
    total_page = paginate.pages
    current_page = paginate.page

    news_list_dict = []
    for news in news_list:
        news_list_dict.append(news.to_basic_dict())

    data = {
        'news_list_dict': news_list_dict,
        'total_page': total_page,
        'current_page': current_page,
        'cid': cid
    }
    return jsonify(errno=RET.OK, errmsg='OK', data=data)


@index_blue.route('/favicon.ico')
def favicon():
    """网页title图标"""
    return current_app.send_static_file('news/favicon.ico')
